昨天和有合約開發實戰經驗的哈士奇老師請教,address 實際上是什麼?因為就在前天,文章打一打另外想到,合約程式裡面寫的 address 可以是指錢包地址,但也可能是指 contract address 合約地址。送一個 transaction 交易可能是「和合約互動」。甚至這兩年來,抽象帳戶 Account Abstraction AA 錢包蔚為潮流,也是以 address 型態來表現。這些全部都是叫「address」。在去中心化的背景下,許多專有名詞變得相對難以理解,也難以區分,甚至可能也不該區分?
以觀察者的角度來看,理論上的分類,合約真要分的話大致是兩種。一種是 EOA 錢包 Externally-owned account (EOA)。 EOA 「外部」錢包的這個說法,是以假想我是 EVM 的情境下去取名的,所以才會說是外部。EOA 錢包是持有私鑰的人擁有的,受私鑰控制。另一種是 contract 合約錢包,受程式碼控制,合約錢包 deploy 成 EVM 能懂的 byte code。合約錢包在用途上的分類來看,又可分成以用戶為主的合約錢包,像是 AA 錢包。另一種以 protocol 為主的合約錢包,像是 Uniswap protocol 或 Morpho protocol。會有其他人與這些 protocol 合約互動的。
針對合約錢包,其中一個值得思考的問題是,合約錢包的簽名是什麼?合約錢包要怎麼在沒有私鑰的情形下做簽名?合約錢包要如何沒有私鑰仍然可進行授權?老師給我的關鍵詞是 isValidSignature()。ERC 介面標準設計 function interface,這邊聚焦在 isValidSignature()。例如,我是多簽 multisig,在這個 function 驗證有足夠的人簽名,比如三取二。或是,passkey 控制的錢包,驗一個新簽章,裡面的數學不同,但最終出來的表現相似。
Account abstraction proposal 詳細內容:(https://github.com/ethereum/ercs/blob/master/ERCS/erc-4337.md)